﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;

class OutPut
{
    private static bool reSize;
    private static bool Move;
    private static bool Scroll;

    private static float Scroloffset = 0;
    private static Vector2 Moaseoffset;

    private static int TextSize;
    private static List<string> buffer = new List<string>();
    private static SpriteFont Font;

    private static Rectangle Shape;

    

    //private static void operator -(string s){
    //    buffer.Add(s);
            
    //}

    //public static void operator -(int i){
    //    buffer.Add(Convert.ToString( i ));
    //}

    //public static void operator -(float i){
    //    buffer.Add(Convert.ToString( i ));
    //}

    //public static void operator -(bool i){
    //    buffer.Add(Convert.ToString( i ));
    //}

    //public static void operator -(double i){
    //    buffer.Add(Convert.ToString( i ));
    //}
    public static void Out(string s){
        buffer.Add(s);
    }

    
    public static void Out(int i){
        buffer.Add(Convert.ToString(i));
    }

    public static void Out(float i)
    {
        buffer.Add(Convert.ToString(i));
    }

    public static void Out(double i)
    {
        buffer.Add(Convert.ToString(i));
    }

    public static void Out(Vector2 i)
    {
        string s = Convert.ToString(i.X) + ":" + Convert.ToString(i.Y);
        buffer.Add(s);
    }


    public static void inInitializ(Rectangle shape, int textsize, SpriteFont fornt){
        Shape = shape;
        TextSize = textsize;
        Font = fornt;
    }

    public static void Clear(){
        buffer.Clear();
    }
        
    public static void Draw(SpriteBatch spriteBatch, Texture2D dot){
        spriteBatch.Draw(dot, Shape, new Color(250,250,250,150));
        
        //int diff = buffer.Count - Shape.Height/TextSize;
        //if(diff < 0){
          //  diff = 0;
        //}
        
        int bufsize = buffer.Count;
        for(int i = 0; i < bufsize; i++){
            float ypos = (Shape.Y + Shape.Height + Scroloffset) - ((bufsize - i) * (Font.LineSpacing));

                if((ypos > Shape.Y)&&(ypos < (Shape.Y+Shape.Height))){

           

                    spriteBatch.DrawString(Font, buffer[i], new Vector2(Shape.X,ypos), Color.Red);

                }
            //spriteBatch.DrawString(Font, buffer[i], new Vector2(Shape.X, Shape.Y + (i * (TextSize+10))), Color.Red);
        }

        if ((buffer.Count * (Font.LineSpacing)) > Shape.Height)
        {
            Scroloffset += CMouse.ScrollWheelDelta/10;

            if (Scroloffset < 0) Scroloffset = 0;
            //if (Scroloffset > buffer.Count * (TextSize + 10)) Scroloffset = buffer.Count*(TextSize + 10);
        }
    }

}




//class COutputScreen : public GUI::Panel
//    {
//    public:

//        COutputScreen(sf::Vector2f pos, sf::Vector2f size){
//            Pos = pos; Size = size; Scroloffset = 0;
//            reSize = 0;Move= 0;Scroll=0;

//            if (!OutFont.LoadFromFile("Data/Fonts/cour.ttf", 15))
//            {
//                std::cout << "Error - COutput::COutput if (!OutFont.LoadFromFile(\"cour.ttf\", 50)), 50)";
//            }

//        }

//        void operator << (char* s){

//            sf::String t (s, OutFont, 12);
//            t.SetColor(sf::Color(200,0,0));
//            buffer.push_back(t);
//        }
//        void out(char* s){
//            sf::String t (s, OutFont, 12);
//            t.SetColor(sf::Color(200,0,0));
//            buffer.push_back(t);
//        }
//        void out(sf::String t){
//            t.SetColor(sf::Color(200,0,0));
//            t.SetSize(12);
//            buffer.push_back(t);
//        }

//        template <class Number>
//        void operator << (Number n){

//            sf::String t (ToString(n), OutFont, 12);
//            t.SetColor(sf::Color(200,0,0));
//            buffer.push_back(t);
//        }

//        void Update(sf::RenderWindow& Wnd){
//            if(reSize){
//                Size = (Mouse - Moaseoffset) - Pos;
//            }else
//            if(Move){
//                Pos = Mouse - Moaseoffset;
//            }else
//            if(Scroll){
//                if((buffer.size()*12)>Size.y){
//                    Scroloffset += MouseDelta.y;
//                    if(Scroloffset < 0)Scroloffset= 0;
//                    if(Scroloffset > buffer.size()*12)Scroloffset= buffer.size()*12;
//                }
//            }
//        }

//        void Darw(sf::RenderWindow& Wnd, sf::Vector2f ParentPosition){



            

//            int diff = buffer.size() - Size.y/70;;
//                if(diff < 0){
//                    diff = 0;
//            }
//            int bufsize = buffer.size();
//            for(int i = 0; i < buffer.size(); i++){
//                //buffer[i].SetPosition(Pos.x, Pos.y+(i*12));
//                float ypos = (Pos.y+Size.y+Scroloffset)-((bufsize - i)*12);

//                if((ypos > Pos.y)&&(ypos < (Pos.y+Size.y))){
//                    buffer[i].SetPosition(sf::Vector2f(Pos.x,ypos));
//                    Wnd.Draw(buffer[i]);
//                }

//            }
//        }

//        void cls(){
//            Scroloffset=0;
//            buffer.clear();
//        }

//    private:
//        virtual void onPressed(){

//            if(Mouse.y < (Pos.y+10)){
//                Moaseoffset = Mouse -Pos;
//                Move = 1;
//            }else
//            if((Mouse.y > (Pos.y+Size.y-20))&&(Mouse.x > (Pos.x+Size.x-20))){
//                reSize = 1;
//                Moaseoffset = Mouse -(Pos + Size);
//            }else{
//                Scroll = 1;
//            }
//        }

//        virtual void onReleased(){
//            reSize = 0;Move= 0;Scroll=0;
//        }

//        virtual void onHold(){
//            /*if(Mouse.y < (Pos.y+20)){
//                Pos = Mouse - Moaseoffset;
//            }*/
//        }
//        bool reSize;
//        bool Move;
//        bool Scroll;

//        float Scroloffset;
//        sf::Vector2f Moaseoffset;
//        int textsize;
//        std::vector<sf::String> buffer;
//        sf::Font OutFont;
//    };

//    RenderWindow & operator<<(RenderWindow & RW,IntBox & TB)
//    {
//        RW.Draw(TB.Rect);
//        RW.Draw(TB.Str);

//        return RW;
//    }
//}